package com.fjl.list.leetcode61;

import com.fjl.list.ListNode;

/**
 * @Description
 * @Author: 01195
 * @Date: 2025/3/18 10:38
 */
/*
给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
1. 先计算链表长度n，同时记录最后一个节点的指针；
2. k%n就是实际移动的步数；
3. 观察会发现其实就是把最后的k%n个节点组成的链表移动到最前面就行。通过遍历链表，找到分界节点后拼成新的链表返回。
 */
public class Clazz {
    public ListNode rotateRight(ListNode head, int k) {
        ListNode p = head;
        if (p == null) return null;
        int len = 0;
        while (p.next != null) {
            p = p.next;
            len++;
        }// 此时的p节点就是尾节点
        len += 1;// 链表的总长度
        k = k % len;// 当k大于len时
        if (k == 0) return head;
        ListNode pre = null;
        ListNode newHead = head;
        for (int i = 0; i < len - k; i++) {
            pre = newHead;
            newHead = newHead.next;
        }// 此时pre就是倒数第k+1的节点，也就是newHead的前一个节点
        pre.next = null;// 断开
        p.next = head;// 尾节点接上头指针
        return newHead;// 返回倒数第k个节点作为新的头结点
    }
}
